#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "quick_sort.h"

int cmpfunc_int(const void *a, const void *b);
int cmpfunc_str(const void *a, const void *b);
int cmpfunc_double(const void *a, const void *b);

int main(int argc, char **argv)
{
    int values[] = {88, 56, 100, 2, 25};
    int values2D[3][4] = {
        {88, 56, 100, 2},
        {25, 15, 70, 40},
        {6, 4, 9, 12}
    };
    char *strArray[] = {"apple", "banana", "orange", "grape", "pear"};
    double dblArray[] = {88.5, 56.3, 100.2, 2.1, 25.9};
    
    int n, m;
    
    // 一维整数数组排序
    printf("测试一维整数数组排序：\n");
    printf("排序之前的列表：\n");
    for (n = 0; n < 5; n++) {
        printf("%d ", values[n]);
    }
    quick_sort(values, 5, sizeof(int), cmpfunc_int);
    printf("\n排序之后的列表：\n");
    for (n = 0; n < 5; n++) {
        printf("%d ", values[n]);
    }
    printf("\n\n");

    // 二维整数数组排序（按每一行排序）
    printf("测试二维整数数组排序（按每一行排序）：\n");
    printf("排序之前的二维数组：\n");
    for (n = 0; n < 3; n++) {
        for (m = 0; m < 4; m++) {
            printf("%d ", values2D[n][m]);
        }
        printf("\n");
    }
    // 通过指向每一行的指针对二维数组排序
    for (n = 0; n < 3; n++) {
        quick_sort(values2D[n], 4, sizeof(int), cmpfunc_int);
    }
    printf("排序之后的二维数组：\n");
    for (n = 0; n < 3; n++) {
        for (m = 0; m < 4; m++) {
            printf("%d ", values2D[n][m]);
        }
        printf("\n");
    }
    printf("\n");

    // 一维字符串数组排序
    printf("测试一维字符串数组排序：\n");
    printf("排序之前的字符串数组：\n");
    for (n = 0; n < 5; n++) {
        printf("%s ", strArray[n]);
    }
    quick_sort(strArray, 5, sizeof(char *), cmpfunc_str);
    printf("\n排序之后的字符串数组：\n");
    for (n = 0; n < 5; n++) {
        printf("%s ", strArray[n]);
    }
    printf("\n\n");

    // 一维 double 数组排序
    printf("测试一维 double 数组排序：\n");
    printf("排序之前的 double 数组：\n");
    for (n = 0; n < 5; n++) {
        printf("%.2f ", dblArray[n]);
    }
    quick_sort(dblArray, 5, sizeof(double), cmpfunc_double);
    printf("\n排序之后的 double 数组：\n");
    for (n = 0; n < 5; n++) {
        printf("%.2f ", dblArray[n]);
    }
    printf("\n");

    return 0;
}


// 比较函数：用于比较两个整数
int cmpfunc_int(const void *a, const void *b) {
    return (*(int *)a - *(int *)b);
}

// 比较函数：用于比较两个字符串
int cmpfunc_str(const void *a, const void *b) {
    return strcmp(*(const char **)a, *(const char **)b);
}

// 比较函数：用于比较两个 double 类型的数值
int cmpfunc_double(const void *a, const void *b) {
    if (*(double *)a > *(double *)b)
        return 1;
    if (*(double *)a < *(double *)b)
        return -1;

    return 0;
}
